#include <bits/stdc++.h>
using namespace std;
const int N=210;
double ans1,ans2=0x3f3f3f3f,mapmax[N],step[N][N];
int g[N][N];
char o;
int n;
struct node
{
	int x,y;
};
node a[N];
void floyd()
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				step[i][j]=min(step[i][j],step[i][k]+step[k][j]);
				
			}
		}
	}
}
double jl(int x1,int y1,int x2,int y2)
{
	return sqrt(pow(x2-x1,2.0)+pow(y2-y1,2.0));
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>o;
			g[i][j]=o-'0';
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(g[i][j]==1) step[i][j]=jl(a[i].x,a[i].y,a[j].x,a[j].y);
			else if(i!=j)
                   			
			    step[i][j]=0x3f3f3f3f;
		}
	}
	floyd();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(step[i][j]!=0x3f3f3f3f)
			{
		      mapmax[i]=max(mapmax[i],step[i][j]);
			  ans1=max(ans1,mapmax[i]);
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(step[i][j]==0x3f3f3f3f)
			{
				ans2=min(ans2,mapmax[i]+mapmax[j]+jl(a[i].x,a[i].y,a[j].x,a[j].y));
				
			}
		}
	}
	double ans=max(ans1,ans2);
	printf("%.6lf",ans);
}
